//observer将data里面的属性转换成getter/setter
class Observer {
    constructor(data){
        this.walk(data)
    }

    walk(data) {
      //1.判断data是否是对象
      if(!data || typeof data !== 'object'){
          return 
      }
      //2.遍历data对象的所有变化属性
       Object.keys(data).forEach(key => {
           this.defineReactive(data, key, data[key]) //转换成响应式数据
       })
    }


    defineReactive(obj,key,val){ 
        let that = this
        //负责收集依赖，并发送通知
        let dep = new Dep
        //val是否还是对象则调用walk处理
        this.walk(val)
       Object.defineProperty(obj,key, {
           enumerable: true,
           configurable:true,
           get(){
               //收集依赖
               Dep.target && dep.addSub(Dep.target)
               return val
           },
           set(newValue){
             if(newValue === val) {
                 return
             }
             val = newValue
             //set 方法newValue 是否还是对象则调用walk处理
             that.walk(newValue)
             //发送通知
             dep.notify()
           }
       })
    }
}